#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <unordered_map>

spdlog::level::level_enum int_log_level_map(int level) {
    std::unordered_map<int, spdlog::level::level_enum> m = { {0, spdlog::level::trace}, {1, spdlog::level::debug}, {2, spdlog::level::info}, {3, spdlog::level::warn}, {4, spdlog::level::err}, {5, spdlog::level::critical}
    };
    auto it = m.find(level);
    if(it != m.end()) {
        return it->second;
    }
    return spdlog::level::trace; // 默认返回trace级别
}
static std::shared_ptr<spdlog::logger> g_default_logger;
//false表示输出到显示屏，true表示输出到文件
void init_logger(const std::string& filename = "", 
                 spdlog::level::level_enum level = spdlog::level::level_enum::trace, 
                 bool mode = false) { 
    //调试模式默认使用同步日志，刷新等级为trace
    if(!mode) {
        g_default_logger = spdlog::stdout_color_mt("default_logger");
        g_default_logger->set_level(spdlog::level::trace);
        g_default_logger->flush_on(spdlog::level::trace);
    }
    else  {
        g_default_logger = spdlog::basic_logger_mt("default_logger", filename);
        g_default_logger->set_level(level);
        g_default_logger->flush_on(level);
    }
    g_default_logger->set_pattern("[%Y-%m-%d %H:%M:%S] [%l] [thread %t] %v");
}
 

#define LOG_TRACE(format, ...) g_default_logger->trace(std::string("[{} {}]") + format, __FILE__, __LINE__,  ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) g_default_logger->debug(std::string("[{} {}]") + format, __FILE__, __LINE__,  ##__VA_ARGS__)
#define LOG_INFO(format, ...) g_default_logger->info(std::string("[{} {}]") + format, __FILE__, __LINE__,  ##__VA_ARGS__)
#define LOG_WARN(format, ...) g_default_logger->warn(std::string("[{} {}]") + format, __FILE__, __LINE__,  ##__VA_ARGS__)
#define LOG_ERROR(format, ...) g_default_logger->error(std::string("[{} {}]") + format, __FILE__, __LINE__,  ##__VA_ARGS__)
#define LOG_FATAL(format, ...) g_default_logger->critical(std::string("[{} {}]") + format, __FILE__, __LINE__,  ##__VA_ARGS__)
